const hello : string = "Hello World!"
console.log( hello )

// TypeScript 区分大写和小写字符。
// 每行指令都是一段语句，你可以使用分号或不使用， 分号在 TypeScript 中是可选的，建议使用。
// 如果语句写在同一行则一定需要使用分号来分隔，否则会报错

// 1、变量声明
// 在 TypeScript 中，可以使用 let, const, 和 var 来声明变量。推荐使用 let 和 const，var 用法不再推荐。
let age : number = 25;
const pi : number = 3.14;
console.log( age, pi );

// 2、函数声明
// 函数声明：TypeScript 允许声明带有类型注解的函数，包括参数类型和返回值类型。
function greet(name : string) : string {
    return "Hello " + name;
}

console.log( greet( "Alice" ) );
// 箭头函数：TypeScript 同样支持 ES6 的箭头函数，使用简洁的语法来声明函数。
const greetFunc = (name : string) => "Hello " + name;
console.log( greetFunc( "John" ) );

// 3、类型断言
// TypeScript 无法推断出一个变量的准确类型，开发者可以使用类型断言来强制指定类型。
let value : any = 'hello';
let strLength : number = (value as string).length;
console.log( strLength );


// 4、泛型
function identity<T>(arg : T) : T {
    return arg;
}
let out = identity<string>( "I'm your father!" );
let numberParams = identity<number>( 123 );
console.log( out, numberParams);

// 5、类型守护
// TypeScript 提供了类型守卫（如 typeof 和 instanceof），用于在运行时缩小变量的类型范围。
function isString(value : any):value is string {
    return typeof value === 'string';
}
let result = isString( "I'm your father!" );
console.log( result );


// 6、异步编程
// TypeScript 完全支持异步编程，可以使用 async/await 语法来处理异步操作。
async function fetchData():Promise<string> {
    const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
    return await response.json();
}
fetchData().then(
    data => console.log(data)
);

// 7、错误处理
const dealWith = (state: boolean) => {
    try {
        if ( !state ) {
            throw new Error('Something went wrong!');
        } else {
            // 处理错误
            console.log('No error occurred.');
        }
    } catch (error) {
        // 处理错误
        if ( error instanceof Error ) {
            console.log( error.message );
        }
    }
};
dealWith( true );
dealWith( false );

